package framework;

import java.util.ArrayList;
import java.util.Properties;

import org.junit.Assert;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import framework.BaseFormExtended.Portal;
import framework.portals.IrrTutBy;
import framework.portals.NeagentBy;
import framework.portals.PortalManager;
import webdriver.Browser;
import webdriver.PropertiesResourceManager;

/** Класс расширенного браузера для имплементации некоторых методов
 */
public class BrowserExtended{

	/** Конструктор
	 */
	public BrowserExtended(){
		instance  = Browser.getInstance();
		driver = instance.getDriver();
		portalsProps = new PortalManager().readPortals();
		
	}
	// поля для инициализации расширенного браузера
	private static RemoteWebDriver driver;
	private static Browser instance;
	
	public static Properties portalsProps;
	
	private final static String URL_STAGE = "urlStage";
	private final static String IRRTUTBY_URL_PROP = "irrTutBy_url";
	private final static String NEAGENTBY_URL_PROP = "neagentBy_url";

	/** Возвращает время таймаута для условия
	 * @return timeoutForCondition
	 */
	public String getTimeoutForCondition() {
		return instance.getTimeoutForCondition();
	}

	/** Возвращает время таймаута для загрузки страницы
	 * @return timeoutForPageLoad
	 */
	public String getTimeoutForPageLoad() {
		return instance.getTimeoutForPageLoad();
	}

	/** Закрывает текущее окно и переключается на предыдущее
	 * @param currentWndCount
	 */
	public void closeWindowAndSwitch() {
		final int wndCount = driver.getWindowHandles().size();
		String handle = driver.getWindowHandle();
		WebDriver wd = driver.switchTo().window(handle);
		wd.close();
		WebDriverWait wait = new WebDriverWait(driver, Long.parseLong(getTimeoutForCondition()));
		try {
			wait.until((ExpectedCondition<Boolean>) new ExpectedCondition<Boolean>() {
				public Boolean apply(final WebDriver d) {
					return d.getWindowHandles().size() < wndCount;
				}
			});
		} catch (TimeoutException e) {
			Assert.assertTrue("Предыдущее окно не закрылось", false);
		}
		selectLastWindow();
	}

	/** Переключается на последнее по счету окно браузера
	 * @param currentWndCount
	 */

	public void selectLastWindow() {
		Object[] handles = driver.getWindowHandles().toArray();
		driver.switchTo().window((String) handles[handles.length - 1]);
	}
	/** Переходит на нужный портал
	 * @param portal - портал
	 * @return страница портала
	 */

	public BaseFormExtended navigateToWindow(Portal portal) {
		switch(portal){
		case IRR_TUT_BY:
			goToPage(IRRTUTBY_URL_PROP);
			return new IrrTutBy();
		case NEAGENT_BY:
			goToPage(NEAGENTBY_URL_PROP);
			return new NeagentBy();
			
		default: return null;
	}
}
	private void goToPage(String urlPropsName){
		String browserUrl = String.format(portalsProps.getProperty(URL_STAGE), portalsProps.getProperty(urlPropsName));
		driver.get(browserUrl);
	}
	
	public void moveToAnotherWindow() {
	    String oldTab = driver.getWindowHandle();
	    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
	    newTab.remove(oldTab);
	    // change focus to new tab
	    driver.switchTo().window(newTab.get(0));
	    driver.close();
	    driver.switchTo().window(oldTab);
	}
}
